package com.macro.mall.portal.service;

import com.macro.mall.common.api.CommonResult;
import com.macro.mall.model.UmsIntegrationChangeHistory;
import com.macro.mall.model.UmsMember;
import com.macro.mall.model.UmsMemberLevel;
import com.macro.mall.model.UmsStore;
import com.macro.mall.portal.dto.CheckInStatusAndIntegrationDto;
import com.macro.mall.portal.dto.UmsCheckInDto;
import com.macro.mall.portal.dto.UmsMemberDto;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 会员管理Service
 * Created by macro on 2018/8/3.
 */
public interface UmsMemberService {
    /**
     * 根据用户名获取会员
     */
    UmsMember getByUsername(String username);

    /**
     * 根据用户名获取会员
     */
    UmsMember getByUsernameOrPhone(String username);

    /**
     * 根据会员编号获取会员
     */
    UmsMember getById(Long id);

    /**
     * 用户注册
     */
    @Transactional
    String register(String realName, String password, String telephone, String authCode,Long agentId);

    /**
     * 生成验证码
     */
    String generateAuthCode(String telephone);

    /**
     * 修改密码
     * 先进行验证码校验，成功了之后再修改密码
     * 之前是验证码和密码一起输入的
     * @author 高强
     * @Date 2020年8月29日
     */
    @Transactional
    void updatePassword(String telephone, String password);

    /**
     * 获取当前登录会员
     */
    UmsMember getCurrentMember();

    /**
     * 根据会员id修改会员积分
     */
    void updateIntegration(Long id,Integer integration);


    /**
     * 获取用户信息
     */
    UserDetails loadUserByUsername(String username, Long agentId);

    /**
     * 登录后获取token
     */
    Map<String, String> login(String username, String password,Integer type,Long agentId);

    /**
     * 通过openId登录
     * @author 高强
     * @date 2020年11月30日
     * @param openId
     * @return
     */
    Map<String, String> loginByOpenId(String openId);

    /**
     * 刷新token
     */
    String refreshToken(String token);

    /**
     * 用户开通/续费会员
     * @author 高强
     * @Date 2020年9月2日
     * @param memberLevelId 会员等级id：1非会员、2包月会员、3季度会员、4半年会员、5年度会员
     * @return
     */
    @Transactional
    int updateMemberLevel(UmsMember member, Long memberLevelId);


    /**
     * 修改部分用户信息
//     * @param id 用户id
     * @param umsMemberDto 待修改的用户信息
     * @return
     */
    @Transactional
    CommonResult<UmsMemberDto> updateMemberInfo(UmsMemberDto umsMemberDto);

    /**
     * 用户签到功能
     * @return
     */
    @Transactional
    CommonResult checkIn();

    /**
     * 查看当前用户签到情况
     * @return 用户的签到状态和绑定门店的签到积分设置的封装
     */
    CommonResult<HashMap> getCheckIn();

    /**
     * 获取门店和用户
     * @return
     */
    CommonResult<HashMap> getMemberStore();

    /**
     * 绑定门店
     * @author zhouboyu
     * @Date 2020年9月11日
     * @param lat
     * @param lon
     * @return
     */
    CommonResult<UmsStore> bindStore(Double lat, Double lon);

    /**
     * 修改手机号校验密码
     * @author 孙晓亮
     * @Date 2020年9月11日
     * @param password 密码
     *
     * @return
     */
    CommonResult verifyPassword( String password);

    /**
     * 修改手机号
     * @author 孙晓亮
     * @Date 2020年9月11日
     * @param authCode 验证码
     * @param phone 手机号
     * @return
     */
    CommonResult updateMemberPhone(String authCode, String phone);

    /**
     * 获取会员信息
     * @param type 0是用积分换的，1是用钱买
     * @return
     */
    CommonResult<List<UmsMemberLevel>> getMemberInfo(Integer type);

    /**
     * 获取用户积分获得记录
     * @return
     */
    List<UmsIntegrationChangeHistory> getIntegrationList();

    /**
     * 使用积分开通会员
     * @param memberLevelId
     * @return
     */
    CommonResult setMemberLevelByIntegration(Long memberLevelId);

    /**
     * 查询经纪人下的客户列表
     * @author zhouboyu
     * @Date 2020年9月13日
     * @return
     */
    List<UmsMember> getAgentMembers();
    /**
     * 获取当前用户订单数量
     * @author zhouboyu
     * @Date 2020年9月23日
     * @return
     */
    CommonResult<Map<String, Object>> getOrderCounts(Integer type);

    /**
     * 获取验证码
     * @param mobile
     * @param type 0是注册，1是忘记密码
     * @return
     */
    CommonResult sendAuthCode(String mobile, Integer type);

    /**
     * 经纪人上传定位
     * @param lat
     * @param lon
     * @return
     */
    CommonResult uploadPositioning(Long memberId, Double lat, Double lon);

    /**
     * 重置用户的缓存
     * @param member
     */
    void handleRedis(UmsMember member);
    /**
     * 生成一条积分变动记录
     * @param member 当前用户
     * @param integration 积分
     * @param operateNote 备注
     * @param changeType 改动类型0增加；1减少
     * @param sourceType 获得积分方式
     * @return
     */
    UmsIntegrationChangeHistory creatIntegrationChange(UmsMember member,Integer integration,String operateNote,Integer changeType,Integer sourceType);

}
